package com.qfmy.webapp.mapper.novel;

import com.qfmy.model.entity.novel.History;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Set;

/**
 * @author 清风明月
 * @Package com.qfmy.web.app.mapper.novel
 * @date 2025/11/13
 * @description 浏览历史
 */
@Mapper
public interface HistoryMapper {

    /**
     * 获取用户浏览历史
     * @param start
     * @param size
     * @param userId
     * @return
     */
    List<History> getHistoriesByUserId(int start, int size, Long userId);

    /**
     * 获取有相似阅读行为的用户（与当前用户至少共同阅读过1本小说的用户）
     * @param userReadNovelIds
     * @param userId
     * @return
     */
    List<Long> findSimilarUserIds(Set<Integer> userReadNovelIds, Long userId);

    /**
     * 获取用户已读过的小说ID
     * @param userId
     * @return
     */
    Set<Integer> getNovelIdsByUserId(Long userId);

    /**
     * 获取相似阅读用户所阅读的
     * @param similarUserIds
     * @param userReadNovelIds
     * @return
     */
    List<Long> findNovelsByUserIds(List<Long> similarUserIds, Set<Integer> userReadNovelIds);

    /**
     * 找到所有阅读过该小说的相似用户
     * @param novelId
     * @return
     */
    List<Long> findUsersByNovelId(Long novelId);

    /**
     * 可以根据阅读次数或阅读时长调整分数
     * @param userId
     * @param novelId
     * @return
     */
    int countReadsByUserAndNovel(Long userId, Long novelId);

    /**
     * 获取用户最新阅读
     * @param userId
     * @return
     */
    History getNewestHistory(Long userId);

    /**
     * 获取用户阅读历史
     * @param userId
     * @param offset
     * @param pageSize
     * @return
     */
    List<History> getHistoriesByPage(Long userId, int offset, Integer pageSize);

    /**
     * 删除用户阅读历史
     */
    void deleteHistory(Integer[] ids);

    /**
     * 清空用户所有阅读历史
     * @param userId
     */
    @Delete("delete from history where user_id = #{userId}")
    void clearAllHistories(Long userId);

    /**
     * 根据用户ID和小说ID查询用户阅读历史
     * @param userId
     * @param novelId
     * @return
     */
    History selectHistory(Long userId, Integer novelId);

    /**
     * 更新用户阅读历史
     *
     * @param novelId
     * @param chapterIndex
     * @param page
     * @param userId
     * @param title
     */
    void UpdateHistory(Integer novelId, Integer chapterIndex, double page, Long userId, String title);

    /**
     * 保存用户阅读历史
     * @param his
     */
    void saveHistory(History his);

}
